package com.xzgj.fmmall.service.job;

import com.github.wxpay.sdk.WXPay;
import com.xzgj.fmmall.dao.OrdersMapper;

import com.xzgj.fmmall.entity.Orders;
import com.xzgj.fmmall.service.OrderService;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import tk.mybatis.mapper.entity.Example;

import javax.annotation.Resource;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Component
public class OrderTimeoutCheckJob {

    @Resource
    private OrdersMapper ordersMapper;
    @Resource
    private OrderService orderService;
    @Scheduled(cron = "0/60 * * * * ?")
    public void checkAndCloseOrder() throws Exception {

        //1.查询超过30min订单状态仍然为未支付状态的订单
        Example example = new Example(Orders.class);
        Example.Criteria criteria = example.createCriteria();
        criteria.andEqualTo("status","1");
        Date time = new Date(System.currentTimeMillis() - 30 * 60 * 1000);
        criteria.andLessThan("create_time",time);//查询超时半小时的订单，andLessThan超时半小时

        List<Orders> orderList = ordersMapper.selectByExample(example);//可能都是超时订单

        //2.访问微信支付平台，确认当前订单最重的支付状态（取消订单：可能都是超时订单，不清楚什么原因导致超时）
        for (int i = 0;i < orderList.size();i++){
            System.out.println("create_time:" + orderList.get(i).getOrder_id() + "\t" + orderList.get(i).getCreate_time() + "\t" + orderList.get(i).getStatus());
        }

        MyPayConfig myPayConfig = new MyPayConfig();
        WXPay wxPay = new WXPay(myPayConfig);

        try {
            for (int i = 0;i < orderList.size();i++){
                Orders order = orderList.get(i);
                HashMap<String,String> params = new HashMap<>();
                params.put("out_trade_no",order.getOrder_id());
                Map<String,String> resp = wxPay.orderQuery(params);
                System.out.println("resp:"+resp);
                //resp:{nonce_str=oqhryBvSIy0pB2Xw, device_info=, trade_state=NOTPAY, out_trade_no=9cf15bf6c146486e8bc0012b8e9791aa, appid=wx632c8f211f8122c6, total_fee=1, trade_state_desc=订单未支付, sign=14ECCB620C71C5AC70FE870E09B38AC4, return_msg=OK, result_code=SUCCESS, mch_id=1497984412, return_code=SUCCESS}
                if ("SUCCESS".equalsIgnoreCase(resp.get("trade_state"))){
                    //订单已支付，则修改订单状态为待发货/已支付status=2（补偿机制）
                    Orders updateOrder = new Orders();
                    updateOrder.setOrder_id(order.getOrder_id());
                    updateOrder.setStatus("2");
                    ordersMapper.updateByPrimaryKeySelective(updateOrder);
                }else if ("NOTPAY".equalsIgnoreCase(resp.get("trade_state"))){

                    //2.2 订单确实未支付，则取消订单：
                    /**
                     * 注意细节：
                     * 1.为避免在订单尚未关闭的时候取消订单前，用户在这个空档期进行支付，所以要关闭订单支付链接;
                     * 2.为保证关闭订单和还原库存的操作、数据库数据的一致性（数据不一致明显不妥），
                     *   我们这里对这两步在订单处理接口OrderService中进行了单独的功能封装
                     */
                    //关闭订单
                    Map<String,String> map = wxPay.closeOrder(params);
                    //通过微信支付平台sdk或者文档，查看操作所需要的参数
                    orderService.closeOrder(order.getOrder_id());
                }
            }
        }catch (Exception e){
            e.printStackTrace();
        }
        //重要：拿着超时订单去微信支付平台去确认订单确实未支付（而不是接口问题---回调接口异常，导致订单超时）导致超时，就取消订单
        /**
         * 2.1 如果订单已支付，则修改订单状态为待发货/已支付status=2（补偿机制）
         *
         * 2.2 订单确实未支付，则取消订单：
         * 2.2.1 向微信支付平台发送请求，关闭当前订单的支付链接---这样用户就不能支付，因为订单已关闭
         * 2.2.2 修改当前订单：status=6 已关闭 close_type=1 超时未支付
         * 2.2.3 还原库存：先根据当前订单编号查询商品快照（sku_id,buy_count）---修改product_sku表，添加回库存
         *
         *
         */
    }
}
